"""
flask-restful 通过 marshal函数 来完成序列化处理
操作步骤如下:
    定义序列化规则
        序列化规则 = {字段名: 序列化类型}
    marshal函数 按照序列化规则 将模型对象转为字典
        序列化后的字典 = marshal(模型对象, 序列化规则)

序列化类型	    说明
String	    可转换 字符串类型属性
Integer	    可转换 整数类型属性
Float	    可转换 浮点数类型属性
List	    可转换 列表类型属性, 要求列表中元素类型唯一
Nested	    可转换 字典类型属性
"""
from flask import Flask
from flask_restful import Resource, Api, marshal, fields

app = Flask(__name__)
api = Api(app)


class User:  # 定义模型类
    def __init__(self):
        self.name = 'zs'
        self.age = 20
        self.height = 1.8
        self.scores = [80, 90]
        self.info = {
            'gender': True
        }


fields = {  # 序列化规则
    'username': fields.String(attribute='name'),  # 指定对应的模型属性
    'age': fields.Integer(default=10),  # 设置默认值
    'height': fields.Float,
    'scores': fields.List(fields.Integer),  # 元素类型唯一
    'info': fields.Nested({'gender': fields.Boolean})
}


class DemoResource(Resource):
    def get(self):
        user1 = User()

        # marshal函数可以按照指定的序列化规则将 模型对象 转为 字典
        # envelope参数可以对序列化数据进行外层包装
        return marshal(user1, fields, envelope='data')


api.add_resource(DemoResource, '/')

if __name__ == '__main__':
    app.run(debug=True)
